/*
**************************************************************************************************************
*											通讯选择处理
*
*  描 述：用户根据实际应用进行通讯解析处理
*
*  配 置： 
*
*  注 意： 
*
*  作 者： 张进
*
*  版 本： V1.0     
*
*  日 期： 2010-06-21
*
*        Copyright (c) 2008-2009   ZhengZhou Brand-NEW C.A.P Electronics CO.,LTD
*
**************************************************************************************************************
*/

#include "..\..\Prj\INC\LIB_Includes.H"


/*
UP_SysCfg.PINkek						//16 PIN密钥	当前  签到获取
UP_SysCfg.MACkek						//08 工作密钥	当前  签到获取

UP_SysCfg.QDState						//签到状态，0:需要签到,非0:签到成功
UP_SysCfg.BatchSta						//批结算状态 0：正常，1：对帐平，结算未处理，2：对帐不平，结算未处理



UP_SysCfg.TVL9F1CData					//08 终端编号	当前 签到使用
UP_SysCfg.TVL9F16Data	  				//15 商户编号	当前 签到使用
UP_SysCfg.ComSn							//03 批次号		当前 签到使用
UP_SysCfg.Key							//16 主密钥		当前 签到使用
更新条件：
01.第一次刷司机签到时更新
02.第一次菜单下载主密钥成功时更新
03.交易记录上传，获取到签到记录时，自动更新此值
使用条件：
01.签到时使用


UPCashCommStatPar.aTVL9F1CData			//08 终端编号	最新值 自动保存记录使用
UPCashCommStatPar.aTVL9F16Data	  		//15 商户编号	最新值 自动保存记录使用
UPCashCommStatPar.aComSn				//03 批次号		最新值 自动保存记录使用
UPCashCommStatPar.aKey					//16 主密钥		最新值 自动保存记录使用
更新条件：
01.每次刷司机卡签到时更新
02.每次菜单下载主密钥，设置终端编号，设置商户编号时更新
使用条件
01.菜单设置查询使用此值
02.开机换天，自动产生签到记录时，使用此值
03.消费交易记录保存，记录流水号大于300时，使用此值产生签到记录


UPCashCommStatPar.RecNoCout				//记录流水号
更新条件：
01.每写入一条消费记录加1
01.每保存一条签到/签退记录清0
使用条件
01.每写入一条消费记录时，判断如果大于300则自动产生签退记录，签到记录

*/


/*
**************************************************************************************************************
*													常 量
**************************************************************************************************************
*/

/*
**************************************************************************************************************
*													类 型
**************************************************************************************************************
*/


/*
**************************************************************************************************************
*													变 量
**************************************************************************************************************
*/
U32 sUPCashDebug_Stat=0;


/*
**************************************************************************************************************
*													函 数
**************************************************************************************************************
*/
/*
**************************************************************************************************************
*
* 函数原型：U32 APP_TaskCommInit( U08 mode )
*
* 函数功能：通讯模式初始化
*
* 函数输入：mode			COMTYPE_UPCASH	银联网络
*							COMTYPE_PUBSER	公交平台
*                
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败  
*   
**************************************************************************************************************
*/	
U32 UP_CommInit( void )
{
	U32 rcode=0;
	Com_Dev_Cfg( UP_Comm_Config.ComType, UP_Comm_Config.WiComBaud, UP_SysCfg.UP_NetAPN, UP_SysCfg.UP_NetName, UP_SysCfg.UP_NetPassword );		

	UP_Hook_Debug_TxData( "->模块启动中...\r\n" );																

	Com_Dev_Open();					//打开
	if(UP_Comm_Config.WiComInitStat)
	{
		rcode = Com_Dev_Restart();		//启用
	}
	else
	{
		rcode = Com_Dev_Start();		//启用
	}
	if( rcode != 0 )				//启用失败
	{ UP_Com_Count[0]++;rcode = Com_Dev_Restart(); }	//重启一次

	if( rcode == 0 )
	{ UP_Com_Count[1]++;UP_Hook_Debug_TxData( "<-启动成功\r\n" ); }
	else
	{ UP_Com_Count[0]++;UP_Hook_Debug_TxData( "<-启动失败\r\n" ); }

	return rcode;
}

/*
**************************************************************************************************************
*
* 函数原型：U32 APP_UPCash_HookConnect( void )
*
* 函数功能：连接服务器
*
* 函数输入：无	
*                
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败  
*   
**************************************************************************************************************
*/
U32 APP_UPCash_HookConnect( void )
{
	U32 rcode;
	U08 static cont_err_cout=0;

//====================>> IP地址有效性判断
	if( ( ( UP_SysCfg.NetUPCashIPAddr[0] == 0x00 )   &&
	      ( UP_SysCfg.NetUPCashIPAddr[1] == 0x00 )   &&
		  ( UP_SysCfg.NetUPCashIPAddr[2] == 0x00 )   &&
		  ( UP_SysCfg.NetUPCashIPAddr[3] == 0x00 ) ) ||
		  ( UP_SysCfg.NetUPCashIPProt == 0x0000 ) )
	{ return 2; }									 			//IP地址为0不连接 

	rcode = Com_Dev_GetResource( );								//获取设备状态
	if( rcode != 0 )
	{ return rcode;	}
		
//	os_mut_wait( Mutex_ComTsk_Resource, 0xFFFF );	
//	os_mut_wait( Mutex_MtnLink_Resource, 0xFFFF );				//获取设置资源			

	rcode = UP_CommInit( );					//切换网络与初始化模块
	if( rcode != 0 )
	{ goto ER_Ret; }

//====================>> 连接服务器
	UP_Hook_Debug_TxData( "->连接中...\r\n" );
	cont_err_cout++;
	rcode = Com_Dev_Connect( UP_SysCfg.NetUPCashIPAddr, UP_SysCfg.NetUPCashIPProt, UP_Comm_Config.WiComConnectTimeOut, 1 );										
	if( rcode != 0 )
	{
		UP_Com_Count[2]++;
		if( cont_err_cout > 3 )	  								//连续三次失败
		{
			cont_err_cout = 0;
			rcode = Com_Dev_Restart(); 							//重启一次
			if( rcode != 0 )
			{ UP_Com_Count[0]++;goto ER_Ret; }
			UP_Com_Count[1]++;
			rcode = Com_Dev_Connect( UP_SysCfg.NetUPCashIPAddr, UP_SysCfg.NetUPCashIPProt, UP_Comm_Config.WiComConnectTimeOut, 1 );
			if( rcode != 0 )	   								//重连服务器
			{ 
				UP_Com_Count[2]++;
				Com_Dev_Disconnect( 1 );						//断开连接,主要异常处理
				goto ER_Ret;
			}
		}
		else
		{ Com_Dev_Disconnect( 1 ); }							//断开连接,主要异常处理
	}
	cont_err_cout = 0;
	if( rcode == 0 )
	{ UP_Com_Count[3]++;UP_Hook_Debug_TxData( "<-连接成功\r\n" ); }
	else
	{ UP_Com_Count[2]++;UP_Hook_Debug_TxData( "<-连接失败\r\n" ); }

	ER_Ret:
	if( rcode != 0 )
	{
//		os_mut_release( Mutex_MtnLink_Resource );				//释放网络资源
//		os_mut_release( Mutex_ComTsk_Resource );
	}

	return rcode;		
}

/*
**************************************************************************************************************
*
* 函数原型：U32 APP_UPCash_HookDisconnect( void )
*
* 函数功能：断开服务器连接
*
* 函数输入：无	
*                
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败  
*   
**************************************************************************************************************
*/
U32 APP_UPCash_HookDisconnect( void )
{
	Com_Dev_Disconnect( 1 );									//断开连接

//	os_mut_release( Mutex_MtnLink_Resource );					//释放网络资源
//	os_mut_release( Mutex_ComTsk_Resource );	

	return 0;	
}

/*
**************************************************************************************************************
*
* 函数原型：U32 APP_UPCash_ComProc( void )
*
* 函数功能：银联通讯处理
*
* 函数输入：无	
*                
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败  
*   
**************************************************************************************************************
*/
U32 APP_UPCash_ComProc( void )
{
	U32 rcode;

	if( UP_SysCfg.Key_MainStat == 0 )							//主密钥未下载
	{ return 1; }

	rcode = APP_UPCash_HookConnect();							//连接网络
	if( rcode != 0 )	
	{ return rcode; }
	UP_Com_OperateRequire();
	if(UP_SysCfg.CAPKeyAndICParmSta&1)							//CA公钥下载
	{ 
		rcode = UP_Com_CAKeyDownLoad( 0 );				//
		if( rcode != 0 )
		{ goto ER_Ret; }
	}
	if(UP_SysCfg.CAPKeyAndICParmSta&2)								//IC卡参数下载
	{ 
		rcode = UP_Com_ParDownLoad( 0 );				//
		if( rcode != 0 )
		{ goto ER_Ret; }
	}
	if( UP_SysCfg.Rec_rSendStat != 0 ) 							//记录重传
	{ 
		rcode = UP_Com_RecReUp( 0 );					//
		if( rcode != 0 )
		{ goto ER_Ret; }  
		UP_SysCfg.Rec_rSendStat = 0;
		rcode = UP_Write_SysCfg( &UP_SysCfg );
		if( rcode != 0 )
		{
			DEF_UPCash_Debug;
			UP_Read_SysCfg( &UP_SysCfg );
		}
	}

	UP_Com_RecUp( 0 );	 								//交易记录上传

	ER_Ret:
	APP_UPCash_HookDisconnect();								//断开连接

	return rcode;
}

/*
**************************************************************************************************************
*
* 函数原型：U32 UP_Com_QD( U32 comstat )
*
* 函数功能：签到处理
*
* 函数输入：comstat		连接网络状态，	B0=1 处理前连接网络					0 处理前不连接网络
*										B1=1 处理后断开网络					0 处理后不断开网络
*                
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败  
*   
**************************************************************************************************************
*/
U32 UP_Com_QD( U32 comstat )
{
	U32 rcode;

	//主密钥下载判断与处理
	if( UP_SysCfg.Key_MainStat == 0 )							//主密钥未下载
	{ return 1; }

	if( ( comstat & 0x01 ) != 0 )
	{
		rcode = APP_UPCash_HookConnect();						//连接网络
		if( rcode != 0 )	
		{ return rcode; }		
	}

	UP_Hook_Debug_TxData( "->签到中...\r\n" );

	rcode = APP_8583_QD(); 										//签到处理
	
	if( rcode == 0 )
	{ UP_Hook_Debug_TxData( "<-签到成功\r\n" ); }
	else
	{ UP_Hook_Debug_TxData( "<-签到失败\r\n" ); }


	if( ( comstat & 0x02 ) != 0 )
	{ APP_UPCash_HookDisconnect(); }							//断开连接	

	return rcode;
}

/*
**************************************************************************************************************
*
* 函数原型：U32 UP_Com_CAKeyDownLoad( U32 comstat )
*
* 函数功能：CA公钥下载
*
* 函数输入：comstat		连接网络状态，	B0=1 处理前连接网络					0 处理前不连接网络
*										B1=1 处理后断开网络					0 处理后不断开网络
*                						B2=1 处理前不检查签到签到状态		0 处理前根据签到状态决定是否先签到
*                
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败  
*   
**************************************************************************************************************
*/
U32 UP_Com_CAKeyDownLoad( U32 comstat )
{
	U32 rcode;

	//主密钥下载判断与处理
	if( UP_SysCfg.Key_MainStat == 0 )							//主密钥未下载
	{ return 1; }

	if( ( comstat & 0x01 ) != 0 )
	{
		rcode = APP_UPCash_HookConnect();						//连接网络
		if( rcode != 0 )	
		{ return rcode; }		
	}

	if(( UP_SysCfg.QDState == 0 )&&((comstat&4) == 0))	   							//未签到
	{
		rcode = UP_Com_QD( 0 );							//
		if( rcode != 0 )
		{ goto ER_Ret; }
	}

	UP_Hook_Debug_TxData( "->CA下载...\r\n" );

	rcode = APP_8583_CAKeyDownLoad();							//CA公钥下载

	if( rcode == 0 )
	{ UP_Hook_Debug_TxData( "<-CA下载成功\r\n" ); }
	else
	{ UP_Hook_Debug_TxData( "<-CA下载失败\r\n" ); }

	ER_Ret:
	if( ( comstat & 0x02 ) != 0 )
	{ APP_UPCash_HookDisconnect(); }							//断开连接	

	return rcode;	
}

/*
**************************************************************************************************************
*
* 函数原型：U32 UP_Com_ParDownLoad( U32 comstat )
*
* 函数功能：IC卡参数下载
*
* 函数输入：comstat		连接网络状态，	B0=1 处理前连接网络					0 处理前不连接网络
*										B1=1 处理后断开网络					0 处理后不断开网络
*                						B2=1 处理前不检查签到签到状态		0 处理前根据签到状态决定是否先签到
*                
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败  
*   
**************************************************************************************************************
*/
U32 UP_Com_ParDownLoad( U32 comstat )
{
	U32 rcode;

	//主密钥下载判断与处理
	if( UP_SysCfg.Key_MainStat == 0 )							//主密钥未下载
	{ return 1; }

	if( ( comstat & 0x01 ) != 0 )
	{
		rcode = APP_UPCash_HookConnect();						//连接网络
		if( rcode != 0 )	
		{ return rcode; }		
	}

	if(( UP_SysCfg.QDState == 0 )&&((comstat&4) == 0))	 	   							//未签到
	{
		rcode = UP_Com_QD( 0 );							//
		if( rcode != 0 )
		{ goto ER_Ret; }
	}

	UP_Hook_Debug_TxData( "->IC卡参数下载...\r\n" );

	rcode = APP_8583_ParDownLoad();								//IC卡参数下载处理

	if( rcode == 0 )
	{ UP_Hook_Debug_TxData( "<-IC卡参数下载成功\r\n" ); }
	else
	{ UP_Hook_Debug_TxData( "<-IC卡参数下载失败\r\n" ); }
		
	ER_Ret:
	if( ( comstat & 0x02 ) != 0 )
	{ APP_UPCash_HookDisconnect(); }							//断开连接	

	return rcode;		
}

/*
**************************************************************************************************************
*
* 函数原型：U32 UP_Com_RecUp( U32 comstat )
*
* 函数功能：交易记录上传银联
*
* 函数输入：comstat		连接网络状态，	B0=1 处理前连接网络					0 处理前不连接网络
*										B1=1 处理后断开网络					0 处理后不断开网络
*                						B2=1 处理前不检查签到签到状态		0 处理前根据签到状态决定是否先签到
*                
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败  
*   
**************************************************************************************************************
*/
U32 UP_Com_RecUp( U32 comstat )
{
	U32 rcode,stat;
	U08 recbuf[DEF_FLASH_MaxRecLength],retbuf[40];

	//主密钥下载判断与处理
	if( UP_SysCfg.Key_MainStat == 0 )							//主密钥未下载
	{ return 1; }

	if( ( comstat & 0x01 ) != 0 )
	{
		rcode = APP_UPCash_HookConnect();						//连接网络
		if( rcode != 0 )	
		{ return rcode; }		
	}

	if(( UP_SysCfg.QDState == 0 )&&((comstat&4) == 0))	 	   							//未签到
	{
		rcode = UP_Com_QD( 0 );							//
		if( rcode != 0 )
		{ goto ER_Ret; }
	}

	while( 1 )
	{
		UP_Hook_Debug_TxData( "->读取一条记录\r\n" );

		rcode = APP_Read_RecFile_NotServer( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, 1, recbuf );
		if( rcode != 0 )			 							//读取一条记录
		{	
			if( rcode == NC_NoRecERR )
			{ 
				UP_Hook_Debug_TxData( "<-未记录\r\n" );
				break; 
			}
			if( rcode == NC_FlashErr )
			{ 
				UP_Hook_Debug_TxData( "<-硬件错误\r\n" );
				return rcode; 
			}
			else										  		//此条记录是错误的
			{ 
				UP_Hook_Debug_TxData( "<-非法数据\r\n" );
				APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, recbuf, 1 ); 
				continue;
			}
		}
		UP_Hook_Debug_TxData( "<-读取成功\r\n" );

		switch( recbuf[4] ) 									//记录类型解析处理
		{
			case UP_RecType_UPCashTrade:						//消费记录处理
				UP_Hook_Debug_TxData( "->交易记录上传\r\n" );
				rcode = APP_Get_RecFileStat( UP_Rec_Config.UP_RecMemoryBank_TradeRec, &stat );
				if( rcode != 0 )
				{ 					
					return 0xFFFF;					 //存储器错误
				}
				if( stat != 0 )
				{		
					return 1;				  	//记录满
				}	
				rcode = APP_8583_BatchRec( recbuf, retbuf );			//发送记录
				if( rcode != 0 )
				{ 
					UP_Hook_Debug_TxData( "<-上传失败\r\n" );
					goto ER_Ret; 
				}
				UP_Hook_Debug_TxData( "<-上传成功\r\n" );
				
				//保存银联记录返回信息
				rcode = UP_HookExchWriteRetRec( UP_Rec_Config.UP_RecMemoryBank_TradeRec, retbuf );
				if( rcode != 0 )
				{ 
					UP_Hook_Debug_TxData( "<-保存银联记录返回信息失败\r\n" );
					goto ER_Ret; 
				}
				//删除本条记录
				APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, recbuf, 1 );
				break;											
			case UP_RecType_UPCashQD: 							//签到记录处理	
				UP_Hook_Debug_TxData( "->签到记录\r\n" );
				if(UP_Mode&UP_MODE_MANGEM)
				{
					UP_SysCfg.QDState = 0;							//终端未签到状态
					memcpy( UP_SysCfg.Key, &recbuf[5],  16 );		//16 主密钥		当前
					memcpy( UP_PosTLVSet.TVL9F1CData, &recbuf[21],  8 );//08 终端编号					
					memcpy( UP_PosTLVSet.TVL9F16Data, &recbuf[29], 15 );//15 商户编号
					memcpy( UP_SysCfg.ComSn, &recbuf[44], 3 );		//03 批次号
					rcode = UP_Write_SysCfg( &UP_SysCfg );
					if( rcode != 0 )
					{ 
						UP_Read_SysCfg( &UP_SysCfg );
						UP_Hook_Debug_TxData( "<-签到参数更新失败\r\n" );
						return rcode; 
					}
				}
				else
				{
				   	if((memcmp(UP_SysCfg.Key, UP_CommStatPar.aKey, 16)!=0)||(memcmp(UP_PosTLVSet.TVL9F1CData, UP_CommStatPar.aTVL9F1CData, 8)!=0)||(memcmp(UP_PosTLVSet.TVL9F16Data, UP_CommStatPar.aTVL9F16Data, 15)==0))
					{
						memcpy( UP_PosTLVSet.TVL9F16Data, UP_CommStatPar.aTVL9F16Data, 15 );
						memcpy( UP_PosTLVSet.TVL9F1CData, UP_CommStatPar.aTVL9F1CData, 8 );
						memcpy( UP_SysCfg.Key, UP_CommStatPar.aKey, 16 );	
						rcode = UP_Write_SysCfg( &UP_SysCfg );	
						if( rcode != 0 )
						{ 
							UP_Read_SysCfg( &UP_SysCfg );
							UP_Hook_Debug_TxData( "<-签到参数更新失败\r\n" );
							return rcode; 
						}
					}
				}
						
				rcode = UP_Write_TlvCfg( &UP_PosTLVSet );
				if( rcode != 0 )
				{ 
					UP_Read_TlvCfg( &UP_PosTLVSet );
					UP_Hook_Debug_TxData( "<-签到参数更新失败\r\n" );
					return rcode; 
				}		
				UP_Hook_Debug_TxData( "<-签到参数更新成功\r\n" );

				APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, recbuf, 1 ); 
																//删除本条记录
				rcode = UP_Com_QD( 0 );					//签到处理
				if( rcode != 0 )
				{ goto ER_Ret; }
				break;
			case UP_RecType_UPCashQT: 							//签退记录处理	
				UP_Hook_Debug_TxData( "->签退记录\r\n" );
				//更新终端参数信息
				//交易记录判断,终端没有交易记录是不是可以不进行批结算处理????
				//??????
				rcode = UP_Com_BatchAll( comstat&4 );
				if( rcode != 0 )
				{ goto ER_Ret; }
				APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, recbuf, 1 ); 
																//删除本条记录
				APP_Set_RecReadp( UP_Rec_Config.UP_RecMemoryBank_Trade, 2, 1 );	
																//重传指针等于当前指针
				break;
			default :
				UP_Hook_Debug_TxData( "->非法记录\r\n" );
				APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, recbuf, 1 ); 
																//删除本条记录????
				break;
		}		
	}

	ER_Ret:
	if( ( comstat & 0x02 ) != 0 )
	{ APP_UPCash_HookDisconnect(); }							//断开连接	

	return rcode;
}
/*
**************************************************************************************************************
*
* 函数原型：U32 APP_UPCash_Com_RecUpTo( U32 comstat, U08 *recbuf )
*
* 函数功能：交易记录重传银联   	  记录会重新结算,谨慎操作
*
* 函数输入：comstat		连接网络状态，	B0=1 处理前连接网络					0 处理前不连接网络
*										B1=1 处理后断开网络					0 处理后不断开网络
*                						B2=1 处理前不检查签到签到状态		0 处理前根据签到状态决定是否先签到
*           recbuf     	记录数据
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败 
*   
**************************************************************************************************************
*/
U32 APP_UPCash_Com_RecUpTo( U32 comstat, U08 *recbuf )
{
	U32 rcode;
	U08 retbuf[40];

	//主密钥下载判断与处理
	if( UP_SysCfg.Key_MainStat == 0 )							//主密钥未下载
	{ return 1; }

	if( ( comstat & 0x01 ) != 0 )
	{
		rcode = APP_UPCash_HookConnect();						//连接网络
		if( rcode != 0 )	
		{ return rcode; }		
	}

	if(( UP_SysCfg.QDState == 0 )&&((comstat&4) == 0))	 	   							//未签到
	{
		rcode = UP_Com_QD( 0 );							//
		if( rcode != 0 )
		{ goto ER_Ret; }
	}

	switch( recbuf[4] ) 									//记录类型解析处理
	{
		case UP_RecType_UPCashTrade:						//消费记录处理
			UP_Hook_Debug_TxData( "->交易记录上传\r\n" );
			rcode = APP_8583_BatchRec( recbuf, retbuf );			//发送记录
			if( rcode != 0 )
			{ 
				UP_Hook_Debug_TxData( "<-上传失败\r\n" );
				goto ER_Ret; 
			}
			UP_Hook_Debug_TxData( "<-上传成功\r\n" );
			//保存银联记录返回信息
			rcode = UP_HookExchWriteRetRec( UP_Rec_Config.UP_RecMemoryBank_TradeRec, retbuf );
			if( rcode != 0 )
			{ 
				UP_Hook_Debug_TxData( "<-保存银联记录返回信息失败\r\n" );
				goto ER_Ret; 
			}
			//删除本条记录
			APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, recbuf, 1 );
			break;											
		case UP_RecType_UPCashQD: 							//签到记录处理	
			UP_Hook_Debug_TxData( "->签到记录\r\n" );

			UP_SysCfg.QDState = 0;							//终端未签到状态
			memcpy( UP_SysCfg.Key, &recbuf[5],  16 );		//16 主密钥		当前
			memcpy( UP_PosTLVSet.TVL9F1CData, &recbuf[21],  8 );//08 终端编号					
			memcpy( UP_PosTLVSet.TVL9F16Data, &recbuf[29], 15 );//15 商户编号
			memcpy( UP_SysCfg.ComSn, &recbuf[44], 3 );		//03 批次号
			rcode = UP_Write_SysCfg( &UP_SysCfg );
			if( rcode != 0 )
			{ 
				UP_Read_SysCfg( &UP_SysCfg );
				UP_Hook_Debug_TxData( "<-签到参数更新失败\r\n" );
				return rcode; 
			}		
			rcode = UP_Write_TlvCfg( &UP_PosTLVSet );
			if( rcode != 0 )
			{ 
				UP_Read_TlvCfg( &UP_PosTLVSet );
				UP_Hook_Debug_TxData( "<-签到参数更新失败\r\n" );
				return rcode; 
			}		
			UP_Hook_Debug_TxData( "<-签到参数更新成功\r\n" );

			APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, recbuf, 1 ); 
															//删除本条记录
			rcode = UP_Com_QD( 0 );					//签到处理
			if( rcode != 0 )
			{ goto ER_Ret; }
			break;
		case UP_RecType_UPCashQT: 							//签退记录处理	
			UP_Hook_Debug_TxData( "->签退记录\r\n" );
			//更新终端参数信息
			//交易记录判断,终端没有交易记录是不是可以不进行批结算处理????
			//??????
			rcode = UP_Com_BatchAll( comstat&4 );
			if( rcode != 0 )
			{ goto ER_Ret; }
			APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, recbuf, 1 ); 
															//删除本条记录
			APP_Set_RecReadp( UP_Rec_Config.UP_RecMemoryBank_Trade, 2, 1 );	
															//重传指针等于当前指针
			break;
		default :
			UP_Hook_Debug_TxData( "->非法记录\r\n" );
			APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, recbuf, 1 ); 
															//删除本条记录????
			break;
	}	

	ER_Ret:
	if( ( comstat & 0x02 ) != 0 )
	{ APP_UPCash_HookDisconnect(); }							//断开连接	

	return rcode;
}
/*
**************************************************************************************************************
*
* 函数原型：U32 UP_Com_BatchAll( U32 comstat )
*
* 函数功能：批结算处理，批结算不允许单独执行
*
* 函数输入：comstat		连接网络状态，	B0=1 处理前连接网络					0 处理前不连接网络
*										B1=1 处理后断开网络					0 处理后不断开网络
*                						B2=1 处理前不检查签到签到状态		0 处理前根据签到状态决定是否先签到
*                
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败  
*   
**************************************************************************************************************
*/
U32 UP_Com_BatchAll( U32 comstat )
{
	U32 rcode;
	U08 recbuf[DEF_FLASH_MaxRecLength];

	//主密钥下载判断与处理
	if( UP_SysCfg.Key_MainStat == 0 )							//主密钥未下载
	{ return 1; }

	if( ( comstat & 0x01 ) != 0 )
	{
		rcode = APP_UPCash_HookConnect();						//连接网络
		if( rcode != 0 )	
		{ return rcode; }		
	}

	if(( UP_SysCfg.QDState == 0 )&&((comstat&4) == 0))	 	   	//未签到
	{
		rcode = UP_Com_QD( 0 );							//
		if( rcode != 0 )
		{ goto ER_Ret; }
	}

	UP_Hook_Debug_TxData( "->读取一条签退记录\r\n" );
	//交易记录上传完成判断
	rcode = APP_Read_RecFile_NotServer( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, 1, recbuf );
	if( rcode != 0 )			 								//读取一条记录
	{ 
		UP_Hook_Debug_TxData( "<-读取失败\r\n" );
		goto ER_Ret; 
	}
	if( recbuf[4] != UP_RecType_UPCashQT )						//当前记录是签退记录
	{ 
		UP_Hook_Debug_TxData( "<-非签退记录\r\n" );
		goto ER_Ret; 
	}
	UP_Hook_Debug_TxData( "<-读取成功\r\n" );

	UP_Hook_Debug_TxData( "->批结算中...\r\n" );
	//批结算处理，更新是否重传标识
	rcode = APP_8583_Batch();  									//批结算处理
	if( rcode != 0 )
	{
		UP_Hook_Debug_TxData( "<-批结算失败\r\n" );
		goto ER_Ret; 
	}

	//记录重传处理
	if( UP_SysCfg.Rec_rSendStat != 0 ) 							//记录重传
	{ 
		rcode = UP_Com_RecReUp( comstat&4 );					//
		if( rcode != 0 )
		{ goto ER_Ret; }
	}

	rcode = APP_8583_BatchOver( );	
	if( rcode != 0 )
	{
		UP_Hook_Debug_TxData( "<-批结算失败\r\n" );
		goto ER_Ret; 
	}	
	UP_Hook_Debug_TxData( "<-批结算结束\r\n" );


	ER_Ret:
	if( ( comstat & 0x02 ) != 0 )
	{ APP_UPCash_HookDisconnect(); }							//断开连接	

	return rcode;	
}

/*
**************************************************************************************************************
*
* 函数原型：U32 UP_Com_RecReUp( U32 comstat )
*
* 函数功能：记录重传处理，不允许单独执行
*
* 函数输入：comstat		连接网络状态，	B0=1 处理前连接网络					0 处理前不连接网络
*										B1=1 处理后断开网络					0 处理后不断开网络
*                						B2=1 处理前不检查签到签到状态		0 处理前根据签到状态决定是否先签到
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败  
*   
**************************************************************************************************************
*/
U32 UP_Com_RecReUp( U32 comstat )
{
	U32 rcode,recnum1,recnum2;
	U08 recbuf[DEF_FLASH_MaxRecLength];

	//需要重传记录处理
	if( UP_SysCfg.Rec_rSendStat == 0 ) 							//记录重传
	{ return 0; }

	if( ( comstat & 0x01 ) != 0 )
	{
		rcode = APP_UPCash_HookConnect();						//连接网络
		if( rcode != 0 )	
		{ return rcode; }		
	}

	//签到与处理
	if(( UP_SysCfg.QDState == 0 )&&((comstat&4) == 0))	 	   	//未签到
	{
		rcode = UP_Com_QD( 0 );							//
		if( rcode != 0 )
		{ goto ER_Ret; }
	}


	rcode = APP_Get_RecFileNum( UP_Rec_Config.UP_RecMemoryBank_Trade, 1, &recnum1 );		
	if( rcode != 0 )											//获取未上传的记录数 正常记录区
	{
		DEF_UPCash_Debug;
		goto ER_Ret;  
	}

	while( 1 )
	{
		UP_Hook_Debug_TxData( "->重传 读取一条交易记录\r\n" );
		rcode = APP_Get_RecFileNum( UP_Rec_Config.UP_RecMemoryBank_Trade, 2, &recnum2 );		
		if( rcode != 0 )										//获取未上传的记录数 重传记录区
		{
			DEF_UPCash_Debug;
			goto ER_Ret;   
		}
		if( recnum1 >= recnum2 )  								//重传的记录已经上传完成
		{
			rcode = 0;
			goto ER_Ret;   
		}

		rcode = APP_Read_RecFile_NotServer( UP_Rec_Config.UP_RecMemoryBank_Trade, 2, 1, recbuf );
		if( rcode != 0 )			 							//读取一条记录
		{	
			if( rcode == NC_NoRecERR )
			{ 
				UP_Hook_Debug_TxData( "<-未记录\r\n" );
				rcode = 0;
				goto ER_Ret;
			}
			if( rcode == NC_FlashErr )
			{ 
				UP_Hook_Debug_TxData( "<-硬件错误\r\n" );
				goto ER_Ret;
			}
			else										  		//此条记录是错误的
			{ 
				UP_Hook_Debug_TxData( "<-非法数据\r\n" );
				APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 2, recbuf, 1 ); 
				continue;
			}
		}
		UP_Hook_Debug_TxData( "<-读取成功\r\n" );

		switch( recbuf[4] ) 									//记录类型解析处理
		{
			case UP_RecType_UPCashTrade:						//消费记录处理
				UP_Hook_Debug_TxData( "->重传 交易记录上传\r\n" );
				rcode = APP_8583_BatchRecT( recbuf );			//发送记录
				if( rcode != 0 )
				{ 
					UP_Hook_Debug_TxData( "<-上传失败\r\n" );
					goto ER_Ret; 
				}
				UP_Hook_Debug_TxData( "<-上传成功\r\n" );				
				APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 2, recbuf, 1 );
				break;											//删除本条记录
			case UP_RecType_UPCashQD: 							//签到记录处理	  不应该进入的???
				UP_Hook_Debug_TxData( "<-签到记录 不管\r\n" );
				APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 2, recbuf, 1 ); 
																//删除本条记录
				break;
			case UP_RecType_UPCashQT: 							//签退记录处理	  不应该进入的???	
				UP_Hook_Debug_TxData( "<-签退记录 结束\r\n" );
				APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 2, recbuf, 1 ); 
																//删除本条记录
				break;
			default :
				UP_Hook_Debug_TxData( "<-非法记录\r\n" );
				APP_Delete_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade, 2, recbuf, 1 ); 
																//删除本条记录????
				break;
		}		
	}

	ER_Ret:
	if( ( comstat & 0x02 ) != 0 )
	{ APP_UPCash_HookDisconnect(); }							//断开连接	

	return rcode;	
}
/**************************************************************************************************************
*Iso8583 处理处理要求
*
* 函数输入：无
*                
* 函数输出：无
*
* 函数返回：0   	成功  
*			非0 	失败  
**************************************************************************************************************
*/
U32 UP_Com_OperateRequire(void)		//处理要求
{		
	U32 rcode,stat=0;	  
	if(UP_SysCfg.QDState == 0)
	{
		rcode = UP_Com_QD(stat);	
		if(rcode)
		{return rcode;}	 
		stat = 0;  
	}
	if((UP_SysCfg.CAPKeyAndICParmSta&3) != 0)
	{
		if(UP_SysCfg.CAPKeyAndICParmSta&1)
		{
			rcode = UP_Com_CAKeyDownLoad(stat);
			if(rcode)
			{return rcode;}
			stat = 0; 
		}
		if(UP_SysCfg.CAPKeyAndICParmSta&2)
		{
			rcode = UP_Com_ParDownLoad(stat);
			if(rcode)
			{return rcode;}
			stat = 0; 
		}
	}
	return 0;
}
/*
**************************************************************************************************************
*                                             通 信 处 理 后 台（使用了前两个指针）	
参数：mode 0:不需要上传到第三方（内部自动处理记录区第三个指针的同步）			1:需要上传到第三方
返回：	0:成功
		非0:失败
**************************************************************************************************************
*/
U32 UP_Comm_BehindOperation(U32 mode)
{
	U32 rcode;
	rcode = APP_UPCash_ComProc();								//01).银联记录上传到银联
	if(mode == 0)
	{APP_Set_RecReadp( UP_Rec_Config.UP_RecMemoryBank_Trade, 3, 1 );}	
	return rcode;
}
/*
**************************************************************************************************************
*                                             获取通信状态计数	
参数：无
返回：CoutTab 通信状态计数数组指针	   从开机到现在的计数
				第0项:模块初始化失败
				第1项:模块初始化成功
				第2项:连接服务器失败
				第3项:连接服务器成功
				第4项:接收数据失败
				第5项:接收数据成功
				第6项:发送数据失败
				第7项:发送数据成功
**************************************************************************************************************
*/
U16* UP_Comm_GetCout(void)
{
	return UP_Com_Count;	
}


